vec2 cplx2(vec2 x) {
	return vec2(x.x*x.x - x.y*x.y, 2.0*x.x*x.y);
}

vec2 cplxMult(vec2 x, vec2 y) {
	return vec2(
		x.x*y.x - x.y*y.y, 
		x.x*y.y + x.y*y.x
	);
}

const int N=300;

uniform float epsilon;

void main()
{
	vec2 c=vec2(-0.726895347709114071439, 0.188887129043845954792);
	vec2 x=vec2(gl_TexCoord[0]);
	vec2 dx=vec2(1.0, 0.0);
	
	float lx;
	float overflow=1.0 / epsilon;
	
	int i;
	for(i=0; i<N; i++) {
		lx=length(x);
		if(lx > 2.0) {
			break;
		}

		dx=2.0 * cplxMult(x, dx);
		x=cplx2(x)+c;
	}
	
	if(lx > 2.0) {
		float ldx=length(dx);
		
		if(ldx > 1e38) {
			gl_FragColor=vec4(1.0, 1.0, 1.0, 1.0);
		} else {
			float d=2.0 * (lx / ldx) * log(lx);
			
			gl_FragColor=vec4(1.0, 1.0, 0.0, 1.0 - d);
		}
	} else {
		gl_FragColor=vec4(0.0, 0.0, 1.0, 1.0);
	}
}